package utils.utilcode.blankj.com.myapplication;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Intent;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.PointF;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements Inter {

    private Button end;
    private ImageView start;
    private RelativeLayout mRelativeLayout;
    private PathMeasure mPathMeasure;
    private float[] mCurrentPosition = new float[2];
    private RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivity(new Intent(this,Meue.class));

    }

    private void init() {
        final ImageView imageView = new ImageView(this);
        imageView.setImageDrawable(start.getDrawable());
        mRelativeLayout.addView(imageView, params);
        //获取父控件左上角距离屏幕的坐标
        int parent[] = new int[2];
        mRelativeLayout.getLocationInWindow(parent);
        //开始点
        int startPosition[] = new int[2];
        start.getLocationInWindow(startPosition);
        //结束点
        int endPosition[] = new int[2];
        end.getLocationInWindow(endPosition);
        //开始的移动点
        int startMovePositionX = startPosition[0] - parent[0];
        int startMovePositionY = startPosition[1] - parent[1];
        //结束的移动点
        int endMovePositionX = endPosition[0] - parent[0];
        int endMovePositionY = endPosition[1] - parent[1];
        //移动到开始点
        PointF controlPointF = getControlPointF(new PointF(startMovePositionX, startMovePositionY), new PointF(endMovePositionX, endMovePositionY), new PointF(startMovePositionX, startMovePositionY));
        Log.e("MainActivity", "controlPointF.x " + controlPointF.x + "  controlPointF.y " + controlPointF.y);
        Path path = new Path();
        path.moveTo(startMovePositionX, startMovePositionY);

        //开始绘制路径(贝塞尔 path.quadTo或者普通path.lineTo)
//        path.lineTo(endMovePositionX,endMovePositionY);
        path.quadTo(startMovePositionX, endMovePositionY, endMovePositionX, endMovePositionY);
        Log.e("MainActivity", (startMovePositionX + endMovePositionX) / 2 + "  " + startMovePositionY);


        mPathMeasure = new PathMeasure(path, false);
        //路径长度
        float length = mPathMeasure.getLength();

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, length);
        valueAnimator.setDuration(1000);
        // 匀速插值器
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //得到距离
                float value = (Float) animation.getAnimatedValue();
                // 获取当前点坐标封装到mCurrentPosition
                mPathMeasure.getPosTan(value, mCurrentPosition, null);
                if (mCurrentPosition != null) {
                    imageView.setX(mCurrentPosition[0]);
                    imageView.setY(mCurrentPosition[1]);
                }
            }
        });
        valueAnimator.start();
        valueAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {

            }

            @Override
            public void onAnimationEnd(Animator animator) {
                Toast.makeText(MainActivity.this, "动画结束", Toast.LENGTH_SHORT).show();
                mRelativeLayout.removeView(imageView);
                startEndAnimal();
            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });
    }

    private void startEndAnimal() {
        ObjectAnimator translationUp = ObjectAnimator.ofInt(end,
                "Visibility", View.GONE, View.VISIBLE);
        translationUp.setInterpolator(new DecelerateInterpolator());
        translationUp.setDuration(500);

//       translationUp.setEvaluator(new ArgbEvaluator());
        translationUp.start();

//        ObjectAnimator animator = ObjectAnimator.ofFloat(end, "rotationX", 0f, 360f);
//        animator.setDuration(500);
////        animator.start();
//        AnimatorSet animatorSet = new AnimatorSet();
//        ObjectAnimator scaleX = ObjectAnimator.ofFloat(end, "rotationX",0f, 360f);
//        ObjectAnimator scaleY = ObjectAnimator.ofFloat(end, "rotationY", 0f, 360f);
//        animatorSet.play(scaleX).with(scaleY);
//        animatorSet.setDuration(300);
//        animatorSet.start();
    }
//
//    private void addCart( ImageView iv) {
////   一、创造出执行动画的主题---imageview
//        //代码new一个imageview，图片资源是上面的imageview的图片
//        // (这个图片就是执行动画的图片，从开始位置出发，经过一个抛物线（贝塞尔曲线），移动到购物车里)
//        final ImageView goods = new ImageView(MainActivity.this);
//        goods.setImageDrawable(iv.getDrawable());
//        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 100);
//        mRelativeLayout.addView(goods, params);
//
////    二、计算动画开始/结束点的坐标的准备工作
//        //得到父布局的起始点坐标（用于辅助计算动画开始/结束时的点的坐标）
//        int[] parentLocation = new int[2];
//        mRelativeLayout.getLocationInWindow(parentLocation);
//
//        //得到商品图片的坐标（用于计算动画开始的坐标）
//        int startLoc[] = new int[2];
//        iv.getLocationInWindow(startLoc);
//
//        //得到购物车图片的坐标(用于计算动画结束后的坐标)
//        int endLoc[] = new int[2];
//        end.getLocationInWindow(endLoc);
//
//
////    三、正式开始计算动画开始/结束的坐标
//        //开始掉落的商品的起始点：商品起始点-父布局起始点+该商品图片的一半
//        float startX = startLoc[0] - parentLocation[0] + iv.getWidth() / 2;
//        float startY = startLoc[1] - parentLocation[1] + iv.getHeight() / 2;
//
//        //商品掉落后的终点坐标：购物车起始点-父布局起始点+购物车图片的1/5
//        float toX = endLoc[0] - parentLocation[0] + end.getWidth() / 5;
//        float toY = endLoc[1] - parentLocation[1];
//
////    四、计算中间动画的插值坐标（贝塞尔曲线）（其实就是用贝塞尔曲线来完成起终点的过程）
//        //开始绘制贝塞尔曲线
//        Path path = new Path();
//        //移动到起始点（贝塞尔曲线的起点）
//        path.moveTo(startX, startY);
//        //使用二次萨贝尔曲线：注意第一个起始坐标越大，贝塞尔曲线的横向距离就会越大，一般按照下面的式子取即可
//        path.quadTo((startX + toX) / 2, startY, toX, toY);
//        //mPathMeasure用来计算贝塞尔曲线的曲线长度和贝塞尔曲线中间插值的坐标，
//        // 如果是true，path会形成一个闭环
//        mPathMeasure = new PathMeasure(path, false);
//
//        //★★★属性动画实现（从0到贝塞尔曲线的长度之间进行插值计算，获取中间过程的距离值）
//        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
//        valueAnimator.setDuration(1000);
//        // 匀速线性插值器
//        valueAnimator.setInterpolator(new LinearInterpolator());
//        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
//            @Override
//            public void onAnimationUpdate(ValueAnimator animation) {
//                // 当插值计算进行时，获取中间的每个值，
//                // 这里这个值是中间过程中的曲线长度（下面根据这个值来得出中间点的坐标值）
//                float value = (Float) animation.getAnimatedValue();
//                // ★★★★★获取当前点坐标封装到mCurrentPosition
//                // boolean getPosTan(float distance, float[] pos, float[] tan) ：
//                // 传入一个距离distance(0<=distance<=getLength())，然后会计算当前距
//                // 离的坐标点和切线，pos会自动填充上坐标，这个方法很重要。
//                mPathMeasure.getPosTan(value, mCurrentPosition, null);//mCurrentPosition此时就是中间距离点的坐标值
//                // 移动的商品图片（动画图片）的坐标设置为该中间点的坐标
//                goods.setTranslationX(mCurrentPosition[0]);
//                goods.setTranslationY(mCurrentPosition[1]);
//            }
//        });
////   五、 开始执行动画
//        valueAnimator.start();
//
////   六、动画结束后的处理
//        valueAnimator.addListener(new Animator.AnimatorListener() {
//            @Override
//            public void onAnimationStart(Animator animation) {
//
//            }
//
//            //当动画结束后：
//            @Override
//            public void onAnimationEnd(Animator animation) {
//                // 购物车的数量加1
////                i++;
////                count.setText(String.valueOf(i));
//                // 把移动的图片imageview从父布局里移除
//                mRelativeLayout.removeView(goods);
//            }
//
//            @Override
//            public void onAnimationCancel(Animator animation) {
//
//            }
//
//            @Override
//            public void onAnimationRepeat(Animator animation) {
//
//            }
//        });
//    }

    /**
     * 根据 最高点，获取贝塞尔曲线的 控制点
     *
     * @param startPointF  开始点
     * @param endPointF    结束点
     * @param bezierPointF 最高点
     * @return
     */
    public static PointF getControlPointF(PointF startPointF, PointF endPointF, PointF bezierPointF) {
        PointF controlPointF = new PointF(0, 0);
        float tmp = 0.5F;
        float t = 0.5F;
        controlPointF.x = (bezierPointF.x - tmp * tmp * startPointF.x - t * t * endPointF.x) / (2 * t * tmp);
        controlPointF.y = (bezierPointF.y - tmp * tmp * startPointF.y - t * t * endPointF.y) / (2 * t * tmp);
        return controlPointF;
    }

    @Override
    public void hello() {

    }
}
